$ () ->
    jQuery.fn.highlight = (color) ->
        this.css({ "background-color" : color })

    jQuery.fn.hasValue = () ->
        (this.val() != null) and (this.val().length > 0)

    jQuery.fn.isEmpty = () ->
        !this.hasValue()

    jQuery.fn.fadeReplace = (replacer) ->
        if jQuery.contains(this, replacer)
            return
        this.fadeOut(1000, () -> replacer.fadeIn())

    jQuery.fn.visibles = () ->
        this.filter(":visible")

    window.checkEmail = (email) ->
        emailRegex = /^[a-z0-9]((-|_)?[a-z0-9])*(\.[a-z0-9]((-|_)?[a-z0-9])*)*@[a-z0-9]((-)?[a-z0-9])*(\.[a-z0-9]((-)?[a-z0-9])*)*(\.[a-z]{2,4})$/i
        emailRegex.test(email)

    window.checkPassword = (pass, confirm) ->
        (pass == confirm) and (pass.length > 7)

    window.loremIpsum = (length) ->
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam mi diam, mattis mollis rhoncus non, venenatis cursus nibh. Aenean viverra fermentum metus, interdum scelerisque purus commodo sit amet. Praesent convallis lobortis purus nec interdum. Maecenas id neque mauris, vitae mattis urna. Sed lacinia lorem vel massa iaculis pharetra. Donec quis metus nec odio ornare semper id at arcu. Phasellus nisl massa, vehicula vehicula imperdiet non, mollis ac mi. Phasellus et fermentum quam. Aenean ultricies magna id urna congue vestibulum.
        Pellentesque nec ipsum purus. Ut fermentum neque faucibus quam ornare pulvinar. Vestibulum ultricies elit non lectus tempus pellentesque. Vestibulum faucibus tristique vestibulum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Donec elementum varius libero ut cursus. Fusce eu velit imperdiet mauris scelerisque bibendum ut vel ipsum. Curabitur mollis, turpis ac venenatis volutpat, orci diam volutpat velit, vel tincidunt quam enim id arcu. Suspendisse eget nisl tortor, at laoreet dolor. Mauris semper leo sit amet risus varius et dignissim sem vehicula. Morbi et est nec est egestas venenatis.
        Aenean mollis, erat ut tempus dictum, mi eros dictum mauris, vel placerat elit nunc a nibh. Cras tincidunt sem eu eros varius rhoncus. Etiam diam massa, tempor eu suscipit feugiat, aliquet nec sem. Mauris suscipit iaculis lectus, et volutpat nunc tempus sit amet. Quisque ut mauris quis erat varius gravida id sed diam. Praesent tempor cursus volutpat. Donec semper, diam vel tincidunt vulputate, massa ante volutpat libero, in congue turpis nunc nec dui. Nunc porta gravida massa, sit amet laoreet sapien feugiat ut. Nunc egestas malesuada metus, quis scelerisque metus scelerisque ut. Fusce in diam ac felis laoreet sollicitudin sit amet eu ante. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur quis mollis augue. Nulla et lorem lacus, et elementum est. Morbi egestas vehicula varius. Nam sit amet laoreet diam.
        Morbi nisl tortor, consequat nec congue eget, fringilla at ante. Suspendisse potenti. Curabitur varius porta nulla, sit amet blandit sapien iaculis a. Aenean sit amet erat ullamcorper nulla euismod posuere non sed augue. Nunc magna risus, tincidunt ac convallis sit amet, molestie quis magna. Pellentesque nec porttitor nunc. Praesent imperdiet porttitor neque, vitae blandit odio laoreet in. Sed congue est libero, eu rutrum velit. Pellentesque at tempor purus. Vivamus ornare turpis ut ligula commodo et scelerisque sapien cursus. Vestibulum erat tortor, porttitor rhoncus condimentum ut, ultricies a libero. Cras ipsum enim, condimentum eget ullamcorper sed, consequat eget erat. Pellentesque elementum dapibus elementum. Nullam justo quam, ornare eu condimentum nec, adipiscing non arcu. Mauris porta dolor at est vehicula fermentum.
        Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin et sem ac dui faucibus sodales non vitae leo. Mauris in ipsum eget magna scelerisque condimentum in non erat. Mauris euismod massa vitae risus tincidunt a lacinia urna tempor. Fusce lobortis imperdiet quam eu faucibus. Vivamus eu odio a mi gravida pellentesque vel et mi. Suspendisse sed sapien viverra ipsum imperdiet consequat at sit amet purus. Donec tristique pretium est eget aliquet. Cras adipiscing ante vitae nisl porttitor fermentum. Pellentesque vel enim id dui blandit consectetur a a ligula. Phasellus sodales rhoncus euismod. Etiam bibendum, diam a auctor scelerisque, nulla ipsum tristique nulla, eget dignissim lorem eros a purus. Curabitur urna odio, luctus at porta nec, consectetur at quam. Mauris sit amet erat lorem, eu placerat eros. Etiam commodo nulla vel sapien tincidunt a lacinia nisl pellentesque."
        .substr(0, length)

    window.closure = (context, func) ->
        return ( () -> func.apply(context, arguments) )

    window.preventiveClosure = (context, func) ->
        return ( (e) ->
            e.preventDefault()
            func.apply(context, arguments)
        )

    window.formatDate = (date, complete) ->
        result = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear()
        if complete
            result = result + ", " + date.getHours() + ":" + date.getMinutes()
        return result

    String.prototype.format = () ->
        length = arguments.length
        temp = this
        for i in [0..(length - 1)]
            temp = temp.replace("{" + i + "}", arguments[i])
        return temp

    window.COOKIE_NAME = "Swim-Session-Id"

    window.isLogged = () ->
        if $.cookie(COOKIE_NAME)
            return true
        else
            return false

    window.isSelfProfile = () ->
        window.targetUser.get("id") == window.currentUser.get("id")

    window.handleErrorCodes = (error, success) ->
        return (xhr, statusText, errorText) ->
            if (xhr.status >= 200) and (xhr.status < 300)
                success()
            else
                error(xhr, statusText, errorText)

    String.prototype.endsWith = (ender) ->
        index = this.indexOf(ender)
        return (index == (this.length - ender.length))

    String.prototype.toSentenceCase = () ->
        initial = this.charAt(0).toString().toUpperCase()
        if this.endsWith(".") || this.endsWith("!")
            final = ""
        else
            final = "."

        return (initial + this.substr(1) + final)

    window.newErrorCallback = (message, func) ->
        return (arg1, arg2) ->
            content = message

            # Depending on which method calls ajax (explicit call or backbone methods)
            # arg1 can either be a model or an xhr

            # In this case, arg1 is a Model
            if arg1.attributes
                xhr = arg2
            else
                xhr = arg1

            if (xhr.responseText and xhr.responseText.length < 250)
                content = content + "\nRemote cause: " + xhr.responseText.toSentenceCase()

            alert(content)

            if func
                func()